﻿using Microsoft.AspNetCore.Mvc.Controllers;
using System.Reflection;

namespace 动态api
{
    public class ApplicationServiceControllerFeatureProvider : ControllerFeatureProvider
    {
        //ControllerFeatureProvider类，用于判断系统中什么类是控制器
        //重写IsController方法，添加实现将实现了IApplicationService接口的类视为控制器
        protected override bool IsController(TypeInfo typeInfo)
        {
            if (typeof(IApplicationService).IsAssignableFrom(typeInfo))
            {
                //1，如果一个接口即使他实现了IApplicationService,他仍然不能是一个控制器，那是因为接口是无法实例化的
                //2，抽象类同理，无法被实例化
                //3，泛型类也不允许，因为其需要明确的类型参数
                //4，public代表公开访问，如果一个类不是public，那么其就不是一个动态webapi控制器
                if (!typeInfo.IsInterface &&//是否接口
                    !typeInfo.IsAbstract &&//是否抽象类
                    !typeInfo.IsGenericType &&//是否泛型
                    typeInfo.IsPublic)//是否为public访问修饰符2
                {
                    return true;
                }
            }
            return false;
        }
    }
}